home *** CD-ROM | disk | FTP | other *** search
/ PC Graphics Unleashed / PC Graphics Unleashed.iso / ch01 / vesa11.c < prev    next >
C/C++ Source or Header  |  1994-03-20  |  7KB  |  251 lines

  1. /**
  2.  ** VESADRV.C ---- EGA, VGA, VESA Super VGA driver for GRX 1.03
  3.  **
  4.  ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  5.  ** Copyright (C) 1992 Csaba Biegl, 820 Stirrup Dr, Nashville, TN 37221
  6.  ** Copyright (C) 1993 Grzegorz Mazur, gbm@ii.pw.edu.pl
  7.  **
  8.  ** This file is distributed under the terms listed in the document
  9.  ** "copying.dj", available from DJ Delorie at the address above.
  10.  ** A copy of "copying.dj" should accompany this file; if not, a copy
  11.  ** should be available from where this file was obtained.  This file
  12.  ** may not be distributed without a verbatim copy of "copying.dj".
  13.  **
  14.  ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
  15.  ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  16.  **/
  17. #pragma  inline
  18.  
  19. #include <stddef.h>
  20. #include <dos.h>
  21. #include "vdr.h"
  22.  
  23. char driver_name[] = {"GRX 1.03 VESA driver"};
  24.  
  25.  
  26. #define MAX_TEXT_MODES        20    /* maximum text mode table size */
  27. #define EGA_TEXT_START        6    /* start of the EGA mode table */
  28. #define EGA_TEXT_MODES        5    /* number of EGA text modes (incl end marker) */
  29. #define VESA_TEXT_START 4
  30.  
  31. GrModeEntry text_mode_table[MAX_TEXT_MODES] =
  32. {
  33.   {80, 25, 2, 0x007, SETUP_STANDARD},
  34.   {40, 25, 16, 0x001, SETUP_STANDARD},
  35.   {80, 25, 16, 0x003, SETUP_STANDARD},
  36.   {80, 50, 16, 0x003, SETUP_8X8_FNT},
  37.  
  38.   {132, 25, 16, 0x109, SETUP_STANDARD},
  39.   {132, 43, 16, 0x10a, SETUP_STANDARD},
  40.   {132, 50, 16, 0x10b, SETUP_STANDARD},
  41.   {132, 60, 16, 0x10c, SETUP_STANDARD},
  42.  
  43.   {0, 0, 0, UNSUP, 0}
  44. };
  45.  
  46.  
  47. #define MAX_GRAPH_MODES        40    /* maximum graphics mode table size */
  48. #define EGA_GRAPH_START        8    /* start of the EGA mode table */
  49. #define EGA_GRAPH_MODES        4    /* number of EGA graphics modes (incl end marker) */
  50. #define VESA_GRAPHIC_START 5
  51.  
  52. GrModeEntry graphics_mode_table[MAX_GRAPH_MODES] =
  53. {
  54.   {320, 200, 16, 0x00d, SETUP_STANDARD},
  55.   {640, 200, 16, 0x00e, SETUP_STANDARD},
  56.   {640, 350, 16, 0x010, SETUP_STANDARD},
  57.   {640, 480, 16, 0x012, SETUP_STANDARD},
  58.   {320, 200, 256, 0x013, SETUP_STANDARD},
  59.  
  60.   {640, 350, 256, 0x11c, SETUP_STANDARD},
  61.   {640, 400, 256, 0x100, SETUP_STANDARD},
  62.   {640, 480, 256, 0x101, SETUP_STANDARD},
  63.   {800, 600, 256, 0x103, SETUP_STANDARD},
  64.   {1024, 768, 256, 0x105, SETUP_STANDARD},
  65.   {1280, 1024, 256, 0x107, SETUP_STANDARD},
  66.  
  67.   {320, 200, 32768U, 0x10d, SETUP_STANDARD},
  68.   {640, 350, 32768U, 0x11d, SETUP_STANDARD},
  69.   {640, 400, 32768U, 0x11e, SETUP_STANDARD},
  70.   {640, 480, 32768U, 0x110, SETUP_STANDARD},
  71.   {800, 600, 32768U, 0x113, SETUP_STANDARD},
  72.   {1024, 768, 32768U, 0x116, SETUP_STANDARD},
  73.   {1280, 1024, 32768U, 0x119, SETUP_STANDARD},
  74.  
  75.   {320, 200, 0xc010U, 0x10e, SETUP_STANDARD},
  76.   {640, 350, 0xc010U, 0x11f, SETUP_STANDARD},
  77.   {640, 400, 0xc010U, 0x120, SETUP_STANDARD},
  78.   {640, 480, 0xc010U, 0x111, SETUP_STANDARD},
  79.   {800, 600, 0xc010U, 0x114, SETUP_STANDARD},
  80.   {1024, 768, 0xc010U, 0x117, SETUP_STANDARD},
  81.   {1280, 1024, 0xc010U, 0x11a, SETUP_STANDARD},
  82.  
  83.   {320, 200, 0xc018U, 0x10f, SETUP_STANDARD},
  84.   {640, 350, 0xc018U, 0x121, SETUP_STANDARD},
  85.   {640, 400, 0xc018U, 0x122, SETUP_STANDARD},
  86.   {640, 480, 0xc018U, 0x112, SETUP_STANDARD},
  87.   {800, 600, 0xc018U, 0x115, SETUP_STANDARD},
  88.   {1024, 768, 0xc018U, 0x118, SETUP_STANDARD},
  89.   {1280, 1024, 0xc018U, 0x11b, SETUP_STANDARD},
  90.  
  91.   {0, 0, 0, UNSUP, 0}
  92. };
  93.  
  94.  
  95. #include "pieces/vesainfo.c"
  96. #include "paging/vesa.c"
  97.  
  98. int do_driver_init(void)
  99. {
  100.   VgaInfoBlock *vb;
  101.   short far *modeptr;
  102.   int mode, table_mode;
  103.   GrModeEntry *table;
  104.  
  105.   HDR->memory_size = 0;
  106.   vb = VESAgetInfo();
  107.   if (vb == NULL) {
  108.     for (table = text_mode_table + VESA_TEXT_START; table->width > 0;
  109.          ++table)
  110.       table->mode.vdr.BIOS_mode = UNSUP;
  111.     for (table = graphics_mode_table + VESA_GRAPHIC_START; table->width > 0;
  112.          ++table)
  113.       table->mode.vdr.BIOS_mode = UNSUP;
  114.   }
  115.   else {
  116.     for (table = text_mode_table + VESA_TEXT_START; table->width > 0;
  117.          ++table) {
  118.       modeptr = vb->VideoModePtr;
  119.       table_mode = table->mode.vdr.BIOS_mode;
  120.       while ((mode = *modeptr++) != (-1)) {
  121.         if (table_mode == mode) break;
  122.       }
  123.       if (mode == (-1))
  124.         table->mode.vdr.BIOS_mode = UNSUP;
  125.     }
  126.     for (table = graphics_mode_table + VESA_GRAPHIC_START; table->width > 0;
  127.          ++table) {
  128.       modeptr = vb->VideoModePtr;
  129.       table_mode = table->mode.vdr.BIOS_mode;
  130.       while ((mode = *modeptr++) != (-1)) {
  131.         if (table_mode == mode) break;
  132.       }
  133.       if (mode == (-1))
  134.         table->mode.vdr.BIOS_mode = UNSUP;
  135.     }
  136.   }
  137.   HDR->driver_flags = GRD_VGA | GRD_NEW_DRIVER | GRD_NO_RW | GRD_4096K;
  138.   return (1);
  139. }
  140.  
  141. #include "pieces/textfont.c"
  142.  
  143.  
  144. int do_mode_set(GrModeEntry * md, int noclear, int *vw, int *vh, char *vflag)
  145. {
  146.   int BIOSno, memmode, pgmode;
  147.  
  148.   switch (md->mode.vdr.custom_setup_index) {
  149.     case SETUP_8X8_FNT:
  150.       return (mode_set_8x8_font(md, noclear));
  151.   }
  152.   if ((BIOSno = md->mode.vdr.BIOS_mode) > 0x13) {
  153.     if (noclear)
  154.       BIOSno |= 0x8000;
  155.     _AX = VESA_FUNC + VESA_SET_MODE;
  156.     _BX = BIOSno;
  157.     geninterrupt(0x10);
  158.     if (_AX != VESA_SUCCESS)
  159.       return (-1);
  160.   }
  161.   else {
  162.     if (noclear)
  163.       BIOSno |= 0x80;
  164.     _AX = BIOSno;
  165.     geninterrupt(0x10);
  166.   }
  167.   pgmode = setup_VESA_paging(md);
  168.   if (pgmode == (-1))
  169.     return (-1);
  170.   switch ((unsigned) md->number_of_colors) {
  171.     case 2U:
  172.       memmode = GRD_1_PLANE;
  173.       break;
  174.     case 16U:
  175.       memmode = GRD_4_PLANES;
  176.       break;
  177.     case 256U:
  178.       memmode = GRD_8_PLANES;
  179.       break;
  180.     case 32768U:
  181.       memmode = GRD_16_PLANES;
  182.       break;
  183.     case 0xc000U + 16:
  184.       memmode = GRD_16_R_PLANES;
  185.       break;
  186.     case 0xc000U + 24:
  187.       memmode = GRD_24_PLANES;
  188.       break;
  189.     default:
  190.       return (-1);
  191.   }
  192.  
  193. #if 0
  194.   if ((md->number_of_colors > 256) && (VESAversion >= VESA_VERSION(1, 2))) {
  195.     ModeInfoBlock *mb = VESAgetModeInfo(md->mode.vdr.BIOS_mode);
  196.     if (mb) {
  197.       HDR->r_mask = mb->RedMaskSize;
  198.       HDR->r_offs = mb->RedMaskPos;
  199.       HDR->g_mask = mb->GreenMaskSize;
  200.       HDR->g_offs = mb->GreenMaskPos;
  201.       HDR->b_mask = mb->BlueMaskSize;
  202.       HDR->b_offs = mb->BlueMaskPos;
  203.       HDR->f_mask = mb->ReservedMaskSize;
  204.       HDR->f_offs = mb->ReservedMaskPos;
  205.       /* is that 16 really only 15 ? */
  206.       if ((memmode == GRD_16_R_PLANES) && (HDR->f_mask > 0))
  207.          memmode = GRD_16_PLANES;
  208.     }
  209.   }
  210. #endif
  211.  
  212. #if 0
  213.   if ((*vw > md->width) || (*vh > md->height)) {
  214.     int virw = *vw;
  215.     int virh = *vh;
  216.     _BX = (virw > md->width) ? 0 : 1;    /* inquire only if width stays the same */
  217.     _CX = virw;
  218.     _AX = VESA_FUNC + VESA_SCAN_LNLEN;
  219.     geninterrupt(0x10);
  220.     if (_AX == VESA_SUCCESS) {
  221.       virw = _CX;
  222.       virh = _DX;
  223.       HDR->line_offset = _BX;
  224.       if ((virw > md->width) || (virh > md->height)) {
  225.          *vw = virw;
  226.          *vh = virh;
  227.          *vflag = 1;
  228.       }
  229.     }       
  230.   }
  231. #endif
  232.  
  233.   return ((HDR->driver_flags & ~(GRD_PLANE_MASK | GRD_PAGING_MASK)) | memmode | pgmode);
  234. }
  235.  
  236.  
  237. void do_screen_start_set(int *cp, int *rp)
  238. {
  239.   _CX = *cp;
  240.   _DX = *rp;
  241.   _BX = 0;
  242.   _AX = VESA_FUNC + VESA_DISP_START;
  243.   geninterrupt(0x10);
  244.   if (_AX == VESA_SUCCESS) {
  245.     *cp = _CX;
  246.     *rp = _DX;
  247.   }
  248. }
  249.  
  250. #include "pieces/vdrmain.c"
  251.